﻿#include <iostream>
#include <functional>  // std::function
using namespace std;

// 普通函数
int add(int a, int b) {
    return a + b;
}

// 函数对象（仿函数）
struct Multiply {
    int operator()(int a, int b) const {
        return a * b;
    }
};

int main() {
    // 1. std::function 保存普通函数
    std::function<int(int, int)> func1 = add;
    cout << "add(3, 4): " << func1(3, 4) << endl;

    // 2. std::function 保存 Lambda 表达式
    std::function<int(int, int)> func2 = [](int a, int b) {
        return a - b;
    };
    cout << "lambda (sub)(10, 6): " << func2(10, 6) << endl;

    // 3. std::function 保存 函数对象
    std::function<int(int, int)> func3 = Multiply();
    cout << "Multiply(2, 5): " << func3(2, 5) << endl;

    // 4. 带捕获变量的 Lambda（只能赋给 auto 或 bind 到其他结构中）
    int factor = 10;
    auto func4 = [factor](int x) {
        return x * factor;
    };
    cout << "lambda with capture: " << func4(3) << endl;

    // 5. 使用 mutable 改变捕获值副本
    auto func5 = [factor]() mutable {
        factor += 5;
        return factor;
    };
    cout << "mutable lambda: " << func5() << endl;  // 15
    cout << "original factor: " << factor << endl;  // 10，不变

    return 0;
}
